package com.hjxr.quota.util;
import net.sourceforge.pinyin4j.PinyinHelper;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 *  * 获取和判断文件头信息
 *
 * @author ma
 * @date 2020/9/3 - 10:46
 **/

@Service
public class FileUtils {
    /**
     *  读取文件头(txt,csv,excel)
     **/
    public static List<String> readFileHead(String proFilePath,String fileName) throws Exception {
        String filePath =proFilePath+"//"+fileName;
        String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());//判断文件类型
        //判断是否存在bom
//        boolean isbom=false;
        if(CleanBom.isBomFile(new File(filePath))){
//            isbom=true;
            CleanBom.cleanBom(new File(filePath));
        }
        if(fileType.equalsIgnoreCase("csv")||fileType.equalsIgnoreCase("txt")){
            List<String> list =new ArrayList<>();
            BufferedReader reader =new BufferedReader(new InputStreamReader( new FileInputStream(filePath),"UTF-8"));
            String firstline = reader.readLine();

            for (String a:firstline.split(",")
            ) {
                list.add(a);
            }
//            if(isbom){//对经过bom处理的表头进行处理
//                String str= list.get(0);
//                if(str.indexOf("\"")==0){
//                    str = str.substring(1,str.length());   //去掉第一个 "
//                }
//                if(str.lastIndexOf("\"")==(str.length()-1)){
//
//                } str = str.substring(0,str.length()-1);  //去掉最后一个 "
//                list.set(0,str.trim());
//            }
            return list;

        }else{
            return readExcel(filePath);
        }
    }


    /**
     *  读取excel表头
     **/
    private static List<String> readExcel(String filepath) throws Exception {
        List<String> list=new ArrayList<>();
        //用流的方式先读取到你想要的excel的文件
        FileInputStream fis = new FileInputStream(new File(filepath));
        String fileType = filepath.substring(filepath.lastIndexOf(".") + 1, filepath.length());//判断文件类型
        Sheet sheet =null;
        if (fileType.equalsIgnoreCase("xls")) {
            //解析excel
            POIFSFileSystem pSystem=new POIFSFileSystem(fis);
            //获取整个excel
            HSSFWorkbook hb=new HSSFWorkbook(pSystem);
            System.out.println(hb.getNumCellStyles());
            //获取第一个表单sheet
            sheet=hb.getSheetAt(0);

        } else if (fileType.equalsIgnoreCase("xlsx")) {
            XSSFWorkbook wb = new XSSFWorkbook(fis);
            //获取第一个表单sheet
            sheet = wb.getSheetAt(0);
        }

        Row row1=sheet.getRow(0);
        if (row1!=null) {
            //获取这一行的第一列
            int firstcell=    row1.getFirstCellNum();
            //获取这一行的最后一列
            int lastcell=    row1.getLastCellNum();
            //创建一个集合，用处将每一行的每一列数据都存入集合中
            for (int j = firstcell; j <lastcell; j++) {
                //获取第j列
                Cell cell=row1.getCell(j);

                if (cell!=null) {
                    System.out.print(cell+"\t");
                    list.add(cell.toString());
                }
            }

            fis.close();
        }
        return list;
    }

    /**
     *  选择字段读取excel内容
     *  List<String> allFieldsList//选取字段列表
     *  List<String> allTitleList//全部文件头列表
     *  List<Integer> fieldIndex//字段下标列表
     *  List<String> allExcelFieldsList //选取字段列表
     *  List<String> fields //获取已选的文件头
     **/
    public static List<List<String>> readExcelRow(String filepath,List<String>allFieldsList,List<String>allTitleList,List<Integer> fieldIndex,List<String> fields) throws Exception {
        List<List<String>> lists = new ArrayList<>();
        List<String> allExcelFieldsList =new ArrayList<>();
        //用流的方式先读取到你想要的excel的文件
        FileInputStream fis = new FileInputStream(new File(filepath));
        String fileType = filepath.substring(filepath.lastIndexOf(".") + 1, filepath.length());//判断文件类型
        Sheet sheet =null;
        if (fileType.equalsIgnoreCase("xls")) {
            //解析excel
            POIFSFileSystem pSystem=new POIFSFileSystem(fis);
            //获取整个excel
            HSSFWorkbook hb=new HSSFWorkbook(pSystem);
            System.out.println(hb.getNumCellStyles());
            //获取第一个表单sheet
            sheet=hb.getSheetAt(0);

        } else if (fileType.equalsIgnoreCase("xlsx")) {
            XSSFWorkbook wb = new XSSFWorkbook(fis);
            //获取第一个表单sheet
            sheet = wb.getSheetAt(0);
        }

        for(int i=0;i<=sheet.getLastRowNum();i++){
            Row row1=sheet.getRow(i);
            if (row1!=null) {
                //获取这一行的第一列
                int firstcell=    row1.getFirstCellNum();
                //获取这一行的最后一列
                int lastcell=    row1.getLastCellNum();
                //创建一个集合，用处将每一行的每一列数据都存入集合中
                if(i==0){//取第一行标题
                    for (int j = firstcell; j <lastcell; j++) {
                        //获取第j列
                        Cell cell=row1.getCell(j);
                        allTitleList.add(cell.toString());
                    }
                    for (String field:fields) {//遍历已选文件头字段
                        fieldIndex.add(allTitleList.indexOf(field));
                    }

                }//excel数据行
                else{
                    for (int j = firstcell; j <lastcell; j++) {
                        //获取第j列
                        Cell cell=row1.getCell(j);
                        if(row1.getCell(j)==null){
                            allExcelFieldsList.add("");
                        }else {
                            allExcelFieldsList.add(cell.toString());
                        }
                    }
                    for (Integer x:fieldIndex) {
                        allFieldsList.add(allExcelFieldsList.get(x));
                    }
                    lists.add(new ArrayList<>(allFieldsList));
                }
            }
            allExcelFieldsList.clear();
            allFieldsList.clear();
        }
        fis.close();
        return lists;
    }

    /**
     * 得到中文首字母（清华大学 -> QHDX）
     * @param str 需要转化的中文字符串
     * @return 大写首字母缩写的字符串
     */
    public static String getPinYinHeadChar(String str) {
        StringBuilder convert = new StringBuilder();
        for (int j = 0; j < str.length(); j++) {
            char word = str.charAt(j);
            String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
            if (pinyinArray != null) {
                convert.append(pinyinArray[0].charAt(0));
            } else {
                convert.append(word);
            }
        }
        return convert.toString().toUpperCase();
    }

    /**
     * 字符串是否包含中文
     *
     * @param str 待校验字符串
     * @return true 包含中文字符 false 不包含中文字符
     *
     */
    public static boolean isContainChinese(String str) {

        Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
        Matcher m = p.matcher(str);
        if (m.find()) {
            return true;
        }
        return false;
    }
}


